package entity;

import java.util.ArrayList;
import javax.swing.JTextArea;

/**
 * 可按段落编辑文字的文本域.
 * @author Rex
 *
 */
public class EasyTextArea extends JTextArea {
	private static final long serialVersionUID = 1L;

	/**
	 * 换行符.
	 */
	private final String line_break = "\r\n";

	/**
	 * 用于存储文本域内已写入的文本，每个元素表示一行.
	 */
	private final ArrayList<String> list;

	public EasyTextArea() {
		super();
		this.setEditable(false);
		list = new ArrayList<>();
	}

	public EasyTextArea(String text) {
		super(text);
		this.append(line_break);
		this.setEditable(false);
		list = new ArrayList<>();
		list.add(text);
	}

	/**
	 * 获取所有文本.
	 * @return 所有文本包含在一个ArrayList<String>中，每行为集合中一个元素
	 */
	public ArrayList<String> getTextList() {
		return list;
	}
	
	/**
	 * 获取最后一行文字所在的行数.
	 * @return 
	 */
	public int getLastIndex() {
		return list.size();
	}

	/**
	 * 按行号获取对应文字. 
	 * 若未找到则返回一个空值。
	 * @param index
	 * @return
	 */
	public String getTextByRow(int index) {
		return (index < 0 || index >= list.size()) ? null : list.get(index);
	}

	/**
	 * 写入文字并换行.
	 * @param str
	 */
	@Override
	public void setText(String str) {
		super.setText(str + line_break);
		list.clear();
		list.add(str);
	}
	
	/**
	 * 清空文字.
	 */
	public void clear() {
		super.setText("");
		list.clear();
	}

	/**
	 * 增加文字并换行.
	 * @param str
	 */
	@Override
	public void append(String str) {
		super.append(str + line_break);
		list.add(str);
	}

	/**
	 * 按行号替换文字.
	 * @param str
	 * @param rowIndex
	 */
	public void editRow(String str, int rowIndex) {
		int size = list.size();
		if (rowIndex >= 0 && rowIndex < size) {
			list.set(rowIndex, str);
			for (int i = 0; i < size; i++) {
				if (i == 0) {
					super.setText(list.get(0) + line_break);
				} else {
					super.append(list.get(i) + line_break);
				}
			}
		}
	}

	/**
	 * 按开头文字寻找行，并替换该行文字. 
	 * 若匹配到多个行，默认只替换第一个匹配到的行。
	 * @param str
	 * @param starts
	 */
	public void editRowByStarts(String str, String starts) {
		int size = list.size();
		for (int i = 0; i < size; i++) {
			if (list.get(i).startsWith(starts)) {
				editRow(str, i);
				return;
			}
		}
	}

	/**
	 * 按结尾文字寻找行，并替换该行文字. 
	 * 若匹配到多个行，默认只替换第一个匹配到的行。
	 * @param str
	 * @param ends
	 */
	public void editRowByEnds(String str, String ends) {
		int size = list.size();
		for (int i = 0; i < size; i++) {
			if (list.get(i).endsWith(ends)) {
				editRow(str, i);
				return;
			}
		}
	}

	/**
	 * 按包含的文字寻找行，并替换该行文字. 
	 * 若匹配到多个行，默认只替换第一个匹配到的行。
	 * @param str
	 * @param contains
	 */
	public void editRowByContains(String str, String contains) {
		int size = list.size();
		for (int i = 0; i < size; i++) {
			if (list.get(i).contains(contains)) {
				editRow(str, i);
				return;
			}
		}
	}

	/**
	 * 按包含的文字寻找行，并替换该行文字. 
	 * 若匹配到多个行，默认只替换第一个匹配到的行。
	 * @param str
	 * @param equals
	 */
	public void editRowByEquals(String str, String equals) {
		int size = list.size();
		for (int i = 0; i < size; i++) {
			if (list.get(i).equals(equals)) {
				editRow(str, i);
				return;
			}
		}
	}

}